package com.atguigu.ting.realtime.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.ting.realtime.common.Constant;
import redis.clients.jedis.Jedis;

import java.sql.Connection;
import java.util.List;

/**
 * @Author lzc
 * @Date 2023/3/20 14:18
 */
public class DimUtil {
    
    
    public static JSONObject readDimFromPhoenix(Connection conn, String table, String id) {
        String sql = "select * from " + table + " where id=?";
        // List一定只有一个元素
        List<JSONObject> list = JdbcUtil.queryList(conn, sql, new Object[]{id}, JSONObject.class, false);
        
        if (list.size() == 0) {
            throw new RuntimeException("没有查到对应的维度数据: " + table + "  " + id);
        }
        
        return list.get(0);
    }
    
    public static JSONObject readDim(Jedis jedis,
                                     Connection conn,
                                     String table,
                                     String id) {
        // 1. 从 redis 去维度
        JSONObject dim = readDimFromRedis(jedis, table, id);
        // 2. 如果没有读到, 则从 phoenix 读取, 并且把读到维度写入到 redis
        if (dim == null) {
            System.out.println("走的 数据库 : " + table + " " + id);
            dim = readDimFromPhoenix(conn, table, id);
            writeDimToRedis(jedis, table, id, dim);
        }else{
            System.out.println("走的 缓存 : " + table + " " + id);
        }
        return dim;
    }
    
    // TODO: 把维度数据写入到 redis 中
    private static void writeDimToRedis(Jedis jedis,
                                        String table,
                                        String id,
                                        JSONObject dim) {
        // string
        String key = getRedisKey(table, id);
    
        /*jedis.set(key, dim.toJSONString());
        // 给这个 key 设置 ttl: 2天
        jedis.expire(key, Constant.TWO_DAYS_IN_SECOND);*/
        
        // 效率比较高: 一次性写入并设置 ttl
        jedis.setex(key, Constant.TWO_DAYS_IN_SECOND, dim.toJSONString());
        
    }
    
    public static String getRedisKey(String table, String id) {
        return table + ":" + id;
    }
    
    // TODO: 从 redis 读取维度数据
    private static JSONObject readDimFromRedis(Jedis jedis, String table, String id) {
        String key = getRedisKey(table, id);
        String json = jedis.get(key);  // key不存在的时候 json 是 null
    
        JSONObject dim = null;
        if (json != null) {
            dim = JSON.parseObject(json);
        }
        return dim;
    }
}
